package com.huai.demo_test1.test;


import org.apache.commons.lang3.StringUtils;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.Year;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;

/**
 * @author zhaohaiming
 * @date 2021/9/10 4:41 下午
 */
public class DateUtil {
    public static final String DEFAULT_FORMAT="yyyy-MM-dd";
    public static final String DEFAULT_DATETIME_FORMAT="yyyy-MM-dd HH:mm:ss";
    public static final String NO_SPLIT_FORMAT="yyyyMMdd";
    public static final String NO_SPLIT_FORMAT_DATETIME="yyyyMMddHHmmss";
    public static final String NO_SPLIT_FORMAT_DATETIME_MILLI="yyyyMMddHHmmssSSS";
    public static final String NO_SPLIT_FORMAT_DATETIME_MILLI_ONLY="HHmmssSSS";
    /**
     * 将日期格式化为指定格式字符串
     * @param date 需要格式化的日期
     * @param formatter 格式化字符串
     * @return 转化后的字符串
     */
    public static String localDateToString(LocalDate date,String formatter) {
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(formatter);
        return date.format(dateTimeFormatter);
    }

    /**
     * 将日期格式化为指定格式字符串
     * @param date 需要格式化的日期
     * @param formatter 格式化字符串
     * @return 转化后的字符串
     */
    public static String localTimeToString(LocalTime date, String formatter) {
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(formatter);
        return date.format(dateTimeFormatter);
    }

    /**
     * 将日期格式化为指定格式字符串
     * @param dateTime 需要格式化的日期
     * @param formatter 格式化字符串
     * @return 转化后的字符串
     */
    public static String localDateTimeToString(LocalDateTime dateTime, String formatter) {
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(formatter);
        return dateTime.format(dateTimeFormatter);
    }
    /**
     * 将日期字符串转化为LocalDate
     * @param dateStr 需要转化的日期字符串
     * @param formatter 格式化字符串
     * @return 转化后的日期
     */
    public static LocalDate stringToLocalDate(String dateStr, String formatter) {
        if (StringUtils.isNotBlank(dateStr)) {
            return LocalDate.parse(dateStr, DateTimeFormatter.ofPattern(formatter));
        }
        return null;
    }
    /**
     * 格式化日期字符串为指定格式日期字符串
     * @param dateStr 需要转化的日期字符串
     * @param inputFormatter 输入字符串日期格式
     * @param outputFormatter 指定转化的日期格式
     * @return 转化后的字符串
     */
    public static String stringToString(String dateStr, String inputFormatter,String outputFormatter) {
        if (StringUtils.isNotBlank(dateStr)) {
            LocalDate date =  LocalDate.parse(dateStr, DateTimeFormatter.ofPattern(inputFormatter));
            return date.format(DateTimeFormatter.ofPattern(outputFormatter));
        }
        return null;
    }
    /**
     * 格式化日期字符串为指定格式日期字符串
     * @param dateStr 需要转化的日期字符串
     * @param inputFormatter 输入字符串日期格式
     * @param outputFormatter 指定转化的日期格式
     * @return 转化后的字符串
     */
    public static String localDateTimeStrToStr(String dateStr, String inputFormatter,String outputFormatter) {
        if (StringUtils.isNotBlank(dateStr)) {
            LocalDateTime date =  LocalDateTime.parse(dateStr, DateTimeFormatter.ofPattern(inputFormatter));
            return date.format(DateTimeFormatter.ofPattern(outputFormatter));
        }
        return null;
    }

    /**
     * 获取当前日期字符串
     * yyyyMMdd
     * @return LocalDate
     */
    public static String nowLocalDateStr() {
        return localDateToString(LocalDate.now(), NO_SPLIT_FORMAT);
    }

    /**
     * 获取当前日期时间字符串
     * yyyyMMddHHmmss
     * @return LocalDateTime
     */
    public static String nowLocalDateTimeStr() {
        return localDateTimeToString(LocalDateTime.now(), NO_SPLIT_FORMAT_DATETIME);
    }

    /**
     * 获取当前日期时间字符串
     * yyyyMMddHHmmssSSS
     * @return LocalDateTime
     */
    public static String nowLocalDateTimeMilliStr() {
        return localDateTimeToString(LocalDateTime.now(), NO_SPLIT_FORMAT_DATETIME_MILLI);
    }

    /**
     * 获取当前日期时间字符串
     * yyyyMMddHHmmssSSS
     * @return LocalDateTime
     */
    public static String nowLocalTimeMilliOnlyStr() {
        return localTimeToString(LocalTime.now(), DateUtil.NO_SPLIT_FORMAT_DATETIME_MILLI_ONLY);
    }

    /**
     * 获取前N天日期
     * @param dateString yyyyMMdd格式
     * @return yyyyMMdd
     */
    public static String getPreviousYear(String dateString, Integer years) {
        return Year.parse(dateString).minus(years, ChronoUnit.YEARS).toString();
    }

    /**
     * 获取当前日期前一天
     * 返回字符串格式 yyyy-MM-dd
     * @return
     */
    public static String getYesterday(){
        // 获取今天的日期
        LocalDate localDate = LocalDate.now();
        // 前一天日期是今天减1
        LocalDate yesterday = localDate.plusDays(-1);
        return localDateToString(yesterday, DateUtil.DEFAULT_FORMAT);
    }
}
